/**
 * 创建一个只能调用 func 一次的函数。重复调用返回第一次调用的结果。
 * func 调用时，this 绑定到创建的函数，并传入对应参数。
 * @param func 指定的触发的函数。
 * @returns 返回新的受限函数。
 * @example
 * const initialize = once(createApplication);
 * initialize();
 * initialize(); // => 第二次调用不会执行createApplication，而是返回第一次的结果
 */
export function once(func: Function): Function {
    if (typeof func !== 'function') {
        throw new TypeError('Expected a function');
    }

    let called = false;
    let result: any;
  
    return function(this: any, ...args: any[]) {
      if (!called) {
        called = true;
        result = func.apply(this, args);
      }
      return result;
    };
}